package cn.demoncat.util.web;

import cn.demoncat.util.lang.StringUtil;
import cn.demoncat.util.lang.constant.StringConstant;
import cn.demoncat.util.web.entity.Agent;
import eu.bitwalker.useragentutils.UserAgent;
import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;

/**
 * HTTP请求的用户代理信息
 * 
 * 注：本工具使用 UserAgentUtils 库，可以识别多种浏览器和设备，不确保全面和最新客户端
 * 
 * @author 延晓磊
 *
 * @since 2019年9月9日
 */
public class UserAgentUtil {

	// HTTP头：用户代理
	private static final String HEADER_USER_AGENT = "User-Agent";

	/**
	 * 获取用户代理头信息
	 * 
	 * @param request
	 * 
	 * @return "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年9月9日
	 */
	public static String getHeader(HttpServletRequest request) {
		return StringUtil.toEmpty(request.getHeader(HEADER_USER_AGENT));
	}

	/**
	 * 获取用户代理信息
	 * 
	 * @param header User-Agent
	 * 
	 * @return 浏览器和设备信息
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年9月9日
	 */
	public static Agent getAgent(String header) {
		Agent agent = new Agent();
		if (StringUtils.isBlank(header)) {
			return agent;
		} else {
			// 获取用户代理信息
			UserAgent userAgent = UserAgent.parseUserAgentString(header);
			// 浏览器
			if (userAgent.getBrowser() != null) {
				// 名称
				agent.setBrowserName(userAgent.getBrowser().getGroup().getName());
				// 版本，全名
				if (userAgent.getBrowserVersion() != null) {
					agent.setBrowserVersion(userAgent.getBrowserVersion().getVersion());
					agent.setBrowser(userAgent.getBrowser().getName() + StringConstant.SEPARATOR + userAgent.getBrowserVersion().getMajorVersion());
				}else {
					agent.setBrowser(userAgent.getBrowser().getName());
				}
				// 类型
				if (userAgent.getBrowser().getBrowserType() != null) {
					agent.setBrowserType(userAgent.getBrowser().getBrowserType().getName());
				}
			}
			// 系统
			if (userAgent.getOperatingSystem() != null) {
				// 名称
				agent.setSystem(userAgent.getOperatingSystem().getName());
				agent.setSystemName(userAgent.getOperatingSystem().getGroup().getName());
				// 类型
				if (userAgent.getOperatingSystem().getDeviceType() != null) {
					agent.setSystemType(userAgent.getOperatingSystem().getDeviceType().getName());
				}
			}
			return agent;
		}
	}

	/**
	 * 获取用户代理信息
	 * 
	 * @param request
	 * 
	 * @return 浏览器和设备信息
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年9月9日
	 */
	public static Agent getAgent(HttpServletRequest request) {
		return getAgent(getHeader(request));
	}

}
